const { ExifTool } = require("exiftool-vendored");
const os = require("os");

/**
 * ExifTool 实例管理器。
 * 用于复用和限制最大的 ExifTool 实例数量。
 */
class ExifToolManager {
  /**
   * 创建一个新的 ExifToolManager。
   * @param {number} maxInstances - 允许的最大 ExifTool 实例数量。
   */
  constructor(maxInstances = 3) {
    this.maxInstances = maxInstances; // 最大实例数
    this.instances = []; // 当前活跃的实例数组
    this.queue = []; // 等待实例可用的队列
  }

  /**
   * 获取一个 ExifTool 实例。
   * 如果达到最大实例数量，则会等待直到有一个实例可用。
   * @returns {Promise<ExifTool>} 返回一个 ExifTool 实例。
   */
  async getInstance() {
    // 如果实例数达到上限，则等待
    while (this.instances.length >= this.maxInstances) {
      await new Promise((resolve) => this.queue.push(resolve));
    }
    // 创建新的 ExifTool 实例
    const exifTool = new ExifTool({
      taskTimeoutMillis: 5000,
      minDelayBetweenSpawnMillis: 0,
      maxProcs: Math.max(os.cpus().length - 2, 1),
    });
    this.instances.push(exifTool);
    return exifTool;
  }

  /**
   * 释放一个 ExifTool 实例，并结束其进程。
   * 如果有等待的队列，会唤醒下一个等待者。
   * @param {ExifTool} exifTool - 要释放的 ExifTool 实例。
   */
  releaseInstance(exifTool) {
    const index = this.instances.indexOf(exifTool);
    if (index > -1) {
      this.instances.splice(index, 1);
      exifTool.end(); // 结束 ExifTool 进程
      // 如果有等待队列，则唤醒下一个
      if (this.queue.length > 0) {
        const next = this.queue.shift();
        next();
      }
    }
  }
}

const manager = new ExifToolManager();

async function getShootTime(filePath, ftype, ctime) {
  const exiftool = await manager.getInstance();

  try {
    const metadata = await exiftool.read(filePath);

    if (ftype === "PIC" && metadata.DateTimeOriginal) {
      return new Date(metadata.DateTimeOriginal).getTime();
    } else if (
      (ftype === "AUDIO" || ftype === "VIDEO") &&
      metadata.CreateDate
    ) {
      return new Date(metadata.CreateDate).getTime();
    }
  } catch (e) {
    console.error("Error reading metadata:", e);
  } finally {
    manager.releaseInstance(exiftool);
  }

  return ctime;
}

module.exports = { manager, getShootTime, ExifToolManager };

// module.exports = ExifToolManager;
